{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"top\"></a><img src=\"./source/SpinalHDL.png\" alt=\"SpinalHDL based on Scala\" style=\"width:320px;\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "  Before running Spinal HDL code, be sure to load SpinalHDL Libraries  \n",
    "**Note** : This may be a little slow when the first time load, please wait a moment to download Lib from remote.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val path = System.getProperty(\"user.dir\") + \"/source/load-spinal.sc\"\n",
    "interp.load.module(ammonite.ops.Path(java.nio.file.FileSystems.getDefault().getPath(path)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Assignment\n",
    "- **:=** Standard assignment, equivalent to ‘<=’ in VHDL/Verilog :<br>the last assignment to a variable wins,<br>the value is not updated until the next simulation delta cycle\n",
    "- **\\\\=** Equivalent to := in VHDL and = in Verilog<br>the value is updated instantly\n",
    "- **<>** Automatic connection between 2 signals or two bundles of the same type.<br>Direction is inferred by using signal direction \n",
    "\n",
    "SpinalHDL checks that there are no combinatorial loops (latches) in your design. If one is detected, it raises an error and SpinalHDL will print the path of the loop."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "####  Connection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    " val a,b,c = UInt(4 bits)\n",
    " a := 0\n",
    " b := a\n",
    " c := a\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "  var x = UInt(4 bits)\n",
    "  val y,z = UInt(4 bits)\n",
    "  x := 0\n",
    "  y := x      //y read x with the value 0\n",
    "  x \\= x + 1\n",
    "  z := x      //z read x with the value 1\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### declare data type"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "val a = UInt(4 bits) //Define a combinatorial signal\n",
    "val b = Reg(UInt(4 bits)) //Define a registered signal\n",
    "val c = Reg(UInt(4 bits)) init(0) //Define a registered signal which is set to 0 when a reset occurs\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### width match check"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val x = in UInt(10 bits)\n",
    "    val y = out UInt(8 bits)\n",
    "    val z,z1 = out UInt()\n",
    "    y := x.resized\n",
    "    z := x.resize(4)\n",
    "    z1 := x.resize(12)\n",
    "    \n",
    "    val a = in SInt(8 bits)\n",
    "    val b = out SInt(16 bits)\n",
    "    b := a.resized\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### constant assigment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val y,z = out UInt(8 bits)\n",
    "    val a,b = out SInt(8 bits)\n",
    "    y := U(3)\n",
    "    z := 3  \n",
    "    a := S(-3)\n",
    "    b := -3\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Branch(When/Switch/Mux)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### conditional branch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "//When \n",
    "class Top extends Component{\n",
    "    val cond1,cond2= in Bool\n",
    "    val dout = out UInt(8 bits)\n",
    "  when(cond1){\n",
    "      dout := 11\n",
    "  //execute when      cond1 is true\n",
    "  }.elsewhen(cond2){\n",
    "      dout := 23\n",
    "  //execute when (not cond1) and cond2\n",
    "  }.otherwise{\n",
    "      dout := 51\n",
    "  //execute when (not cond1) and (not cond2)\n",
    "  }\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### case branch \n",
    "A complete case statement generate by the spinalddl switch  \n",
    "The switch generated in chisel is replaced by if else. Although there is no problem in function, but it is not very good-looking."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "//Switch \n",
    "class Top extends Component{\n",
    " val x = in UInt(2 bits)\n",
    " val dout = out UInt(8 bits)\n",
    " switch(x){\n",
    "  is(0){\n",
    "    //execute when x === value1\n",
    "    dout := 11\n",
    "  }\n",
    "  is(1){\n",
    "    //execute when x === value2\n",
    "    dout := 23\n",
    "  }\n",
    "  default{\n",
    "    //execute if none of precedent condition meet\n",
    "    dout := 51\n",
    "  }\n",
    " }\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Mux, cond Expression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "//Mux cond? \n",
    "class Top extends Component{\n",
    "val cond = in Bool\n",
    "val muxOutput,muxOutput2 = out UInt(8 bits)\n",
    " muxOutput  := Mux(cond, U(33,8 bits), U(51, 8 bits))\n",
    " muxOutput2 := cond ? U(22,8 bits) | U(49, 8 bits)\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### sel.mux Expression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "//mux\n",
    "class Top extends Component{\n",
    "    val io = new Bundle{\n",
    "        val src0,src1 = in Bool()\n",
    "    }\n",
    "  val bitwiseSelect = UInt(2 bits)\n",
    "  val bitwiseResult = bitwiseSelect.mux(\n",
    "   0 -> (io.src0 & io.src1),\n",
    "   1 -> (io.src0 | io.src1),\n",
    "   2 -> (io.src0 ^ io.src1),\n",
    "   default -> (io.src0)\n",
    "  )\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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fX19J3OatBEdBOwqBShAAQpQQN8EciQwQZs3b57NadL6NoqMlwIUoAAFKGBkApkJjFwuP/TZZ5+tFKdJ37lzp7GRMbC7FNBLAU6j1sthY9AUoEBxCowYMSL+/v3773GadHGqsi4KUIACFKAABUpEQBCE6uIDeQcPHuwtCIJ5iTTCSilAAQpQgAIUoEBxC8TExFgKgsBnYhU3LOujAAUoQAEKUIACFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEKUIACFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEKUIACFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEKUIACFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEKUIACFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEKUIACFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEKUIACFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEKUIACFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEKUIACFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEKUIACFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAUoQAGdFPg/eZwfPdQN+YMAAAAASUVORK5CYII="
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### sel.mux expression， subdivideIn function\n",
    "`muxLists(...)` is another bitwise selection which take as input a sequence of tuples.   \n",
    "Below an example of dividing a Bits of 128 bits into 32 bits:\n",
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "//mux\n",
    "class Top extends Component{\n",
    "  val sel  = in UInt(2 bits)\n",
    "  val data = in Bits(128 bits)\n",
    "  val dataWord = sel.muxList(for(index <- 0 until 4) yield (index, data(index*32+32-1 downto index*32)))\n",
    "  // This example can be written shorter.\n",
    "  val dataWord2 = data.subdivideIn(32 bits)(sel)\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Rules"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "val a, b, c = UInt(8 bits) // Define 3 combinatorial signals\n",
    "  c := a + b   // c will be set to 7\n",
    "  b := 2       // b will be set to 2\n",
    "  a := b + 3   // a will be set to 5\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "val x, y = Bool             //Define two combinatorial signals\n",
    "val result = UInt(8 bits)   //Define a combinatorial signal\n",
    "\n",
    "result := 1\n",
    "when(x){\n",
    "  result := 2\n",
    "  when(y){\n",
    "    result := 3\n",
    "  }\n",
    "}\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "val inc, clear = Bool            //Define two combinatorial signal/wire\n",
    "val counter = Reg(UInt(8 bits))  //Define a 8 bits register\n",
    "\n",
    "when(inc){\n",
    "  counter := counter + 1\n",
    "}\n",
    "when(clear){\n",
    "  counter := 0    //If inc and clear are True, then this  assignement wins (Last valid assignement rule)\n",
    "}\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Package operations as methods improve abstract ability"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "    val inc, clear = Bool\n",
    "val counter = Reg(UInt(8 bits))\n",
    "\n",
    "def setCounter(value : UInt): Unit = {\n",
    "  counter := value\n",
    "}\n",
    "\n",
    "when(inc){\n",
    "  setCounter(counter + 1)  // Set counter with counter + 1\n",
    "}\n",
    "when(clear){\n",
    "  counter := 0\n",
    "}\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Internal methods can operate on all variables under Component"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "val inc, clear = Bool\n",
    "val counter = Reg(UInt(8 bits))\n",
    "\n",
    "def setCounterWhen(cond : Bool,value : UInt): Unit = {\n",
    "  when(cond) {\n",
    "    counter := value\n",
    "  }\n",
    "}\n",
    "\n",
    "setCounterWhen(cond = inc,   value = counter + 1)\n",
    "setCounterWhen(cond = clear, value = 0)\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Of course, it can also be package as an independent function, which is passed in as a parameter by the operation object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Top extends Component{\n",
    "val inc, clear = Bool\n",
    "val counter = Reg(UInt(8 bits))\n",
    "\n",
    "def setSomethingWhen(something : UInt,cond : Bool,value : UInt): Unit = {\n",
    "  when(cond) {\n",
    "    something := value\n",
    "  }\n",
    "}\n",
    "\n",
    "setSomethingWhen(something = counter, cond = inc,   value = counter + 1)\n",
    "setSomethingWhen(something = counter, cond = clear, value = 0)\n",
    "}\n",
    "showRtl(new Top)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Scala",
   "language": "scala",
   "name": "scala"
  },
  "language_info": {
   "codemirror_mode": "text/x-scala",
   "file_extension": ".scala",
   "mimetype": "text/x-scala",
   "name": "scala",
   "nbconvert_exporter": "script",
   "version": "2.12.8"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
